(* DONT_TOUCH = "TRUE" *)
module negedge_pulse (
    input  wire clk,
    input  wire rst_n,
    input  wire data_in,
    output wire pulse_out
);

    // 寄存器，用于存储 data_in 在上一个时钟周期的值
    reg data_in_dly;

    // 时序逻辑：在每个时钟上升沿，更新 data_in_dly 的值
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            // 复位时，将寄存器清零
            data_in_dly <= 1'b0;
        end else begin
            // 将当前的 data_in 值存入寄存器，供下一个时钟周期使用
            data_in_dly <= data_in;
        end
    end

    // 组合逻辑：检测下降沿
    // 当上一个周期是 '1' (data_in_dly) 并且当前周期是 '0' (~data_in) 时，
    // pulse_out 输出 '1'。
    assign pulse_out = data_in_dly & ~data_in;

endmodule